package com.sgap.exam.camera2;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import android.content.Intent;
import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.RectF;
import android.graphics.drawable.Drawable;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationManager;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.ItemizedOverlay;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;
import com.google.android.maps.MyLocationOverlay;
import com.google.android.maps.Overlay;
import com.google.android.maps.OverlayItem;
import com.google.android.maps.Projection;
public class MyMapViewActivity extends MapActivity {
private MapView map = null;
private MyLocationOverlay me = null;
private double lat, lon;
boolean drawMyPos = false;
LocationManager locationManager;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mapview);
// astrTime = getIntent().getStringArrayExtra("time");
// astrLat = getIntent().getStringArrayExtra("lat");
// astrLon = getIntent().getStringArrayExtra("lon");
lat = Double.parseDouble(Commons.astrLat[2]);
lon = Double.parseDouble(Commons.astrLon[2]);
Button btn_map = (Button)findViewById(R.id.btn_map);
btn_map.setEnabled(false);
Button btn_camera = (Button)findViewById(R.id.btn_camera);
btn_camera.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(getBaseContext(), CameraActivity.class);
startActivity(intent);
}
});
map = (MapView) findViewById(R.id.map);
map.getController().setCenter(getGeoPoint(lat, lon));
map.getController().setZoom(16);
map.setBuiltInZoomControls(true);
map.setSatellite(false);
Drawable marker;
marker = getResources().getDrawable(R.drawable.map_view_pin01);
marker.setBounds(0, 0, marker.getIntrinsicWidth(), marker.getIntrinsicHeight());
map.getOverlays().add(new CircleOverlay());
map.getOverlays().add(new SitesOverlay(marker));
// 현재 위치를 맵뷰에서 보여주게 고안된 클래
me = new MyLocationOverlay(this, map);
map.getOverlays().add(me);
// 나침반을 보여준다.
me.enableCompass();
// 내 위치의 마커(기본)을 보여준다.
me.enableMyLocation();
}
@Override
public void onResume() {
super.onResume();
me.enableCompass();
me.enableMyLocation();
}
@Override
public void onPause() {
super.onPause();
me.disableMyLocation();
me.disableCompass();
}
@Override
protected boolean isRouteDisplayed() {
return (false);
}
private String getMyPosAddress(double dbLat, double dbLon) {
String addressString = "No address found";
Geocoder gc = new Geocoder(this, Locale.getDefault());
try {
List<Address> addresses = gc.getFromLocation(dbLat, dbLon, 1);
if (addresses.size() > 0) {
Address address = addresses.get(0);
addressString = address.getAddressLine(0);
addressString = addressString.substring(addressString.indexOf(" ") + 1);
}
} catch (IOException e) {
e.printStackTrace();
}
return addressString;
}
private GeoPoint getGeoPoint(Location loc) {
return getGeoPoint(loc.getLatitude(), loc.getLongitude());
}
private GeoPoint getGeoPoint(double lat, double lon) {
return (new GeoPoint((int) (lat * 1E6), (int) (lon * 1E6)));
}
private class SitesOverlay extends ItemizedOverlay<OverlayItem> {
private List<OverlayItem> items = new ArrayList<OverlayItem>();
Resources mRes;
private Drawable marker = null;
public SitesOverlay(Drawable marker) {
super(marker);
this.marker = marker;
mRes = getResources();
for (int i = 0; i < Commons.astrLat.length; i++) {
Double dbLat, dbLon;
dbLat = Double.parseDouble(Commons.astrLat[i]);
dbLon = Double.parseDouble(Commons.astrLon[i]);
OverlayItem overlay = new OverlayItem(getGeoPoint(dbLat, dbLon), Commons.ThingsName[i], getMyPosAddress(dbLat, dbLon));
overlay.setMarker(mRes.getDrawable(Commons.Things[i]));
items.add(overlay);
}
populate();
}
@Override
protected OverlayItem createItem(int i) {
return (items.get(i));
}
@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow) {
// //////////////////////////////////////////////////////////////////////////
// Get the current location
for (int i = 0; i < items.size(); i++) {
this.marker = mRes.getDrawable( Commons.Things[i]);
if (i == 0)
drawItem(canvas, mapView, shadow, new GeoPoint(0, 0), items.get(i).getPoint(),
items.get(i).getTitle());
else
drawItem(canvas, mapView, shadow, items.get(i - 1).getPoint(), items.get(i)
.getPoint(),items.get(i).getTitle());
}
}
@Override
protected boolean onTap(int i) {
// Toast.makeText(MyMapViewActivity.this, items.get(i).getSnippet(), Toast.LENGTH_SHORT)
// .show();
Intent intent = new Intent(getBaseContext(), MyDetailActivity.class);
startActivity(intent);
return (true);
}
@Override
public int size() {
return (items.size());
}
public void drawItem(Canvas canvas, MapView mapView, boolean shadow,
GeoPoint geoStartPoint, GeoPoint geoPoint, String markerName) {
int mRadius = 5;
if (shadow == false) {
// Convert the location to screen pixels
Point point = new Point();
Projection projection = mapView.getProjection();
projection.toPixels(geoPoint, point);
// Setup the paint
Paint paint = new Paint();
paint.setARGB(255, 255, 255, 255);
paint.setAntiAlias(true);
paint.setFakeBoldText(true);
Paint backPaint = new Paint();
backPaint.setARGB(180, 50, 50, 50);
backPaint.setAntiAlias(true);
int letterWidth;
int ratio;
if (markerName.contains(" "))
ratio = 13;
else
ratio = 14;
letterWidth = markerName.length() * ratio;
RectF backRect = new RectF(point.x + 2 + mRadius, point.y - 3 * mRadius, point.x
+ letterWidth, point.y + mRadius);
// Draw the marker
canvas.drawRoundRect(backRect, 5, 5, backPaint);
canvas.drawText(markerName, point.x + 2 * mRadius, point.y, paint);
// gtko: 새로운 마커를 그린다...
int xx = 20;
int yy = 30;
this.marker.setBounds(point.x+xx, point.y-yy, point.x+xx+marker.getIntrinsicWidth(), point.y-yy+ marker.getIntrinsicHeight());
this.marker.draw(canvas);
/*
* Point startPosition = new Point();
* projection.toPixels(geoStartPoint, startPosition);
* if(geoStartPoint.getLatitudeE6() != 0) { // draw 메서드에서
* drawLine()을 이용해 선을 그을것입니다. Paint paintLine = new Paint(); //
* 선을 긋기 위한 페인트 생성 paintLine.setARGB(180,0, 0, 255);
* paintLine.setStrokeWidth(3); // 굵기
* paintLine.setAntiAlias(true); // 부드럽게 처리. //선을 긋습니다.
* canvas.drawLine(point.x, point.y, startPosition.x,
* startPosition.y, paintLine); }
*/
}
super.draw(canvas, mapView, shadow);
boundCenterBottom(marker);
}
}
public class CircleOverlay extends Overlay {
@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow) {
if (shadow == false) {
// Convert the location to screen pixels
Point point = new Point();
Projection projection = mapView.getProjection();
projection.toPixels( getGeoPoint(lat, lon), point);
// 타원을 그린다.
Paint paintA = new Paint();
paintA.setARGB( 100, 255, 0, 0);
paintA.setAntiAlias(true);
canvas.drawCircle(point.x, point.y, 100, paintA);
// 원을 그린다
// Paint paint = new Paint();
// paint.setARGB( 250, 255, 0, 0);
// paint.setAntiAlias(true);
// int rad = 100;
// RectF oval = new RectF(point.x - rad, point.y - rad, point.x + rad, point.y + rad);
// Paint paintC = new Paint();
// paintC.setARGB( 250, 23, 45, 0);
// paintC.setAntiAlias(true);
//// canvas.drawOval(oval, paint);
// canvas.drawArc(oval, 0, 360, false, paintC);
}
}
}
}